
$(function(){
	/*$.getScript('js/jquery-ui.min.js',function(){
		updatePrecent(10);
		$.getScript('js/widget.js',onUi);
	});*/
	
	onUi();
});

function onUi(){
	updatePrecent(10);
	$( "#gantt tbody" ).sortable({
		items: "tr:not(.unsortable)",
		deactivate: function( event, ui ) {
			drawGantt();
		}
	});
	updatePrecent(20);
	
	//绑定id的事件
	$('#gantt').on('spin','.id input',function(event,ui){
		var toadd=($(event.srcElement).text()=='▲')?1:-1;
		var oldvalue = $(event.target).val();
		ui.value = idloop(toadd,ui,event.target);
		onIdChange(oldvalue,ui.value);
		drawGantt();
		return false;
		//$(event.target).data('spinner').spinner('value',ui.value);
	});
	
	//绑定pid的事件
	$('#gantt').on('spin','.pid input',function(event,ui){

		var thisid = parseInt($(this).parents('tr').attr('data-id'));
		if(ui.value<0 || ui.value>=thisid){
			$(event.target).attr('title','前置任务必须存在且比自身id小（避免循环）')
			.tooltip({close:function(){
				$(this).attr('title','');
			}}).tooltip('open');
		}
			
		var toadd=($(event.srcElement).text()=='▲')?1:-1;
		$ids = $('[data-id]');var idarr=[];
		for(var i=0;i<$ids.length;i++){
			var curid =parseInt($($ids[i]).attr('data-id'));
			if(curid<thisid){
				idarr.push(curid);	
			}
		}
		idarr = idarr.sort();var cur = $(event.target).val();
		if(toadd>0){
			for(var i=idarr.length-1;i>=0;i--){
				if(idarr[i]>cur){
					//$(this).data('spinner').spinner('value',idarr[i]);
					onPidChange(thisid,idarr[i]);
				}
			}
		}else{
			for(var i=0;i<idarr.length;i++){
				if(idarr[i]<cur){
					onPidChange(thisid,idarr[i]);
					//$(this).data('spinner').spinner('value',idarr[i]);
				}
			}
		}
		drawGantt();
		return false;
	});

	updatePrecent(30);

	
	//cost
	//绑定pid的事件
	$('#gantt').on('spin','.cost input',function(event,ui){
		if(ui.value<1) return false;
		$tr = $(this).parents('tr');
		$tr.find('.end input').datepicker('setDate',dateAdd(new Date($tr.find('.start input').val()),ui.value-1));
		var curpid = $tr.attr('data-id');
		$('.pid input[value='+curpid+']').each(function(){
			onPidChange($(this).parents('tr').attr('data-id'),curpid);
		});

		$(this).data('spinner').spinner('value',ui.value);
		drawGantt();
		return false;
	});
	
	$('#gantt').on('change','.desc input',function(){
		drawGantt();
	});
	
	//新建任务
	$('<tr class="unsortable newtask"><td colspan="8"><button>+新建任务</button></td></tr>').appendTo('#gantt .left tbody').find('button').button().click(function(){
		newTask();
	});
	updatePrecent(100);
}

function idloop(toadd,ui,input){
	if(-1 == toadd && ui.value<1){
		//没有找到合适的
		ui.value = parseInt($(input).parents('tr').attr('data-id'));
		$(input).data('spinner').spinner("value",ui.value);
		return ui.value;
	}
	if($('[data-id='+ui.value+']').length > 0){
		ui.value+=toadd;
		return idloop(toadd,ui,input);
	}else{
		$(input).parents('tr').attr('data-id',ui.value);
		$(input).data('spinner').spinner('value',ui.value);
		return ui.value;
	}	
}

function updatePrecent(val){
	if(val){
		updatePrecent.prototype.config.tar = val;
	}
	if(updatePrecent.prototype.config.cur<updatePrecent.prototype.config.tar){
		updatePrecent.prototype.config.cur+=updatePrecent.prototype.config.step;
		clearTimeout(updatePrecent.prototype.config.to);
		updatePrecent.prototype.config.to = setTimeout(updatePrecent,updatePrecent.prototype.config.dur);
	}
	var cur = updatePrecent.prototype.config.cur;
	$('#progressbar').progressbar({value: cur,});
	$('#loading span').text(cur+'%');
	if(updatePrecent.prototype.config.tar>=100){
		clearTimeout(updatePrecent.prototype.config.to);
		
		$('#loading').fadeOut(function(){
			$('#gantt').fadeIn();
		});
	};
};
updatePrecent.prototype.config={
	step:1,
	cur:0,
	tar:0,
	dur:10,
	to:null
};

function newTask(id,pid,desc,cost,start,end){
	if(id){
		$("#gantt .newtask").before($('tr.sample').clone().attr('data-id',id).attr('class','taskitem'));
		$tpl = $("#gantt [data-id="+id+"]");
		
		var addSpinner=function(item,value){
			$(item).data('spinner',$(item).spinner());
			$(item).data('spinner').spinner("value",value);
		};

		addSpinner($tpl.find('.id input'),id);
		addSpinner($tpl.find('.pid input'),pid);
		$tpl.find('.desc input').val(desc);
		addSpinner($tpl.find('.cost input'),cost);
		$tpl.find('.start input').datepicker({dateFormat:'yy-mm-dd',onSelect:function(dateText, inst){
			$tr = $(this).parents('tr');
			var ds = new Date(dateText);var de = new Date($tr.find('.end input').val());
			if(dateDiff(de,ds)<0){
				alert("任务结束日期不可以比开始日期早");
				return false;
			}
			var doff = dateDiff(de,ds,1);
			$tr.find('.pid input').data('spinner').spinner('value',0);
			$tr.find('.cost input').data('spinner').spinner('value',doff);
			$(this).datepicker('setDate',ds);
			drawGantt();
			return false;
		}}).datepicker('setDate',start);
		$tpl.find('.end input').datepicker({dateFormat:'yy-mm-dd',onSelect:function(dateText, inst){
			$tr = $(this).parents('tr');
			var de = new Date(dateText);var ds = new Date($tr.find('.start input').val());
			if(dateDiff(de,ds)<0){
				alert("任务结束日期不可以比开始日期早");
				return false;
			}
			var doff = dateDiff(de,ds,1);
			$tr.find('.cost input').data('spinner').spinner('value',doff);
			$(this).datepicker('setDate',de);
			drawGantt();
			return false;
		}}).datepicker('setDate',end);		
		$tpl.find('.resource select').combobox();			
	}else{
		//取最大的id+1为新id
		//取默认资源最晚完成的任务为前置任务
		$ids = $('[data-id]');var idarr=[];var idmax = 0;var endmaxindex=0;
		if($ids.length>0){
			for(var i=0;i<$ids.length;i++){
				idarr.push(parseInt($($ids[i]).attr('data-id')));
				if('默认' == $($ids[i]).find('.resource select').val()
						&& new Date($($ids[i]).find('.end input').val())>new Date($($ids[endmaxindex]).find('.end input').val())){
					endmaxindex=i;
				}				
			}
			idarr = idarr.sort();
			idmax=idarr[idarr.length-1];
		}else{
			endmaxindex = -1;
		}
		var newid = idmax+1;
		var pid = 0; var start = getFirstWorkDate(); var end=new Date();
		if(endmaxindex>=0){
			pid = $($ids[endmaxindex]).attr('data-id');
			start = dateAdd((new Date($($ids[endmaxindex]).find('.end input').val())),1);			
		}
		end = start;
		newTask(newid,pid,'任务'+newid,1,start,end);
		drawGantt();
	}
	
};


function onIdChange(old,cur){
	if(old == cur){
		return;
	}else{
		$rs = $('.pid input[value='+old+']');
		$rs.each(function(){
			$(this).data('spinner').spinner('value',cur);
			onPidChange($(this).parents('tr').attr('data-id'),cur);
		});
	}
}

function onPidChange(id,pcur){
	var curid = parseInt(id);
	if(curid == 0)return;
	
	$tr = $('[data-id='+id+']');
	var dscur = dateAdd(getEndDateOfId(pcur),1);
	var decur = dateAdd(dscur,parseInt($tr.find('.cost input').val())-1);
	$tr.find('.start input').datepicker('setDate',dscur);
	$tr.find('.end input').datepicker('setDate',decur);
	$tr.find('.pid input').data('spinner').spinner('value',pcur);
	
	$('.pid input[value='+id+']').each(function(){
		onPidChange(parseInt($(this).parents('tr').attr('data-id')),curid);
	});
}



function getEndDateOfId(id){
	return new Date($('[data-id='+id+']').find('.end input').val());
}


function dateAdd(d,a,strict){
	if(strict){
		return new Date(d.getTime()+86400000*a);
	}else{
		var i = 0;
		while(i<a){
			var d1 = dateAdd(d,1,1);
			if($.inArray(d1.getDay(),dateAdd.prototype.workday) != -1){
				i++;
			}
			d=d1;
		}
		return d;
	}
}

dateAdd.prototype.workday = [1,2,3,4,5];


function getFirstWorkDate(d){
	if(!d){
		d = new Date();
	}
	if($.inArray(d.getDay(),dateAdd.prototype.workday) == -1){
		d = dateAdd(d,1);
	}
	return d;
}

function dateDiff(d1,d2,workday){
	if(workday){
		if(d1<d2){alert('use bigger one first');}
		var i = 0;
		while(dateDiff(d1,d2)>0){
			i++;
			d2 = dateAdd(d2,1);
		}
		return i;
	}else{
		return parseInt((d1.getTime()-d2.getTime())/86400000);			
	}
}

function drawGantt(){
	$('#gantt .right ul').html('');
	$('.sample .resource select').find('option').each(function(){
		if(!drawGantt.prototype.resourceColorMap[$(this).text()]){
			drawGantt.prototype.resourceColorMap[$(this).text()] = 'rgb('
	            + (Math.floor(Math.random() * 256)) + ','
	            + (Math.floor(Math.random() * 256)) + ','
	            + (Math.floor(Math.random() * 256)) + ')';
		}
	});
	var mindate=0;var maxdate=0;var arr=[];
	$trs = $('#gantt tr.taskitem');
	if($trs.length == 0) return;
	$trs.each(function(){
		var obj = new Object();
		obj.id = $(this).find('.id input').val();
		obj.pid = $(this).find('.pid input').val();
		obj.desc = $(this).find('.desc input').val();
		obj.cost = $(this).find('.cost input').val();
		obj.start = new Date($(this).find('.start input').val());
		obj.end = new Date($(this).find('.end input').val());
		obj.resource = $(this).find('.resource select').val();
		arr.push(obj);
		
		if(mindate==0){
			mindate=obj.start;
		}else if(obj.start<mindate){
			mindate = obj.start;
		}
		
		if(maxdate==0){
			maxdate=obj.end;
		}else if(obj.end>maxdate){
			maxdate=obj.end;
		}
		
		$('#gantt .right ul').append('<li id="task_'+obj.id+'"><div class="bar" style="border-bottom:10px solid '+
				drawGantt.prototype.resourceColorMap[obj.resource]+'">'+obj.desc+'</div></li>');
	});
	
	var total = dateDiff(maxdate,mindate)+1;
	
	for(var i=0;i<arr.length;i++){
		var obj = arr[i];
		$('#task_'+obj.id+' .bar')
		.css('margin-left',((dateDiff(obj.start,mindate)/total)*100)+'%')
		.css('width',((dateDiff(obj.end,obj.start)+1)/total*100)+'%');
	}

	$('.right .bg').html('');
	var w = $('.right ul').width()/total-1;
	var h = $('.right ').height()+10;
	for(var i=0;i<total;i++){
		var d = dateAdd(mindate,i,1);
		$('<div></div>').appendTo($('.right .bg'))
		.text((d.getMonth()+1)+'-'+d.getDate()).width(w).height(h)
		.addClass('d'+(i%2)).addClass('dy'+d.getDay());
	}
}
drawGantt.prototype.resourceColorMap = [];